#include "common.h"

void init_rcc(void)
{
    RCC->CR |= (1 << 0);  // 使用内部高速时钟
    while (!(RCC->CR & (1 << 1)))
        ;  // 等待内部高速时钟

    RCC->CFGR &= ~(3 << 0);  // 使用内部高速时钟作为系统时钟
    while ((RCC->CFGR & (3 << 2)))
        ;  // 等待系统时钟作为内部高速时钟

    RCC->CR &= ~(1 << 24);  // 禁止PLL
    while ((RCC->CR & (1 << 25)))
        ;  // 等待PLL未锁定

    RCC->CR &= ~(1 << 16);  // 关闭外部高速时钟
    while (RCC->CR & (1 << 17))
        ;                   // 等待外部高速时钟没有就绪
    RCC->CR &= ~(1 << 18);  // 外部高速时钟没有旁路

    RCC->CFGR &= ~(1 << 17);  // 外部高速时钟1分频后作为PLL的输入,8M/1 = 8M
    RCC->CFGR |= (1 << 16);   // 外部高速时钟作为PLL的输入
    RCC->CFGR &= ~(15 << 18);
    RCC->CFGR |= (7 << 18);   // PLL经过12倍频后输出8M*9=72M
    RCC->CFGR &= ~(1 << 22);  // PLL/1.5作为USB时钟48M
    RCC->CFGR &= ~(15 << 4);  // AHB时钟不分频72M
    RCC->CFGR &= ~(7 << 8);
    RCC->CFGR |= (4 << 8);    // APB1二分频72M/2=36M
    RCC->CFGR &= ~(7 << 11);  // APB2不分频72M
    RCC->CFGR &= ~(3 << 14);
    RCC->CFGR |= (2 << 14);  // ADC为PLCK2的4分频72M/6 = 12M

    RCC->CR |= (1 << 16);  // 开启外部高速时钟
    while (!(RCC->CR & (1 << 17)))
        ;  // 等待外部高速时钟就绪

    RCC->CR |= (1 << 24);  // 使能PLL
    while (!(RCC->CR & (1 << 25)))
        ;  // 等待PLL锁定

    RCC->CFGR |= (RCC->CFGR & (~(3 << 0))) | (2 << 0);  // 使用PLL作为系统时钟
    while ((2 << 2) != (RCC->CFGR & (3 << 2)))
        ;
}
